use crate::interpreter::value::{Value, ValueData};

/// 集合类型的通用接口
pub trait Collection {
    /// 获取集合长度
    fn len(&self) -> usize;

    /// 检查集合是否为空
    fn is_empty(&self) -> bool;

    /// 获取集合类型名称
    fn type_name(&self) -> &str;

    /// 转换为字符串表示
    fn to_string(&self) -> String;
}

/// 为Value实现Collection特质的辅助方法
impl Collection for Value {
    fn len(&self) -> usize {
        match &self.data {
            ValueData::List(elements) => elements.borrow().len(),
            ValueData::Dict(items) => items.borrow().len(),
            ValueData::Set(items) => items.borrow().len(),
            ValueData::Tuple(items) => items.len(),
            _ => 0,
        }
    }

    fn is_empty(&self) -> bool {
        self.len() == 0
    }

    fn type_name(&self) -> &str {
        &self.type_name
    }

    fn to_string(&self) -> String {
        self.to_string()
    }
}
